/****************************************************************************
**
** Copyright (C) 2013 Atmel Corporation and/or its subsidiary(-ies).
** All rights reserved.
**
** LIMITED License Agreement
**
** IT IS IMPORTANT THAT YOU READ THIS AGREEMENT CAREFULLY AND COMPLETELY.
** This Limited License Agreement (“Agreement”) is a legally binding agreement between,
** on one hand, either your employer (if you are acting on behalf of your employer)
** or you (if you are acting on your own behalf) (“Licensee”), and on the other hand,
** Atmel Corporation (“Atmel”).
**
** By installing or using any of the software downloaded or provided with these
** terms (“Licensed Software”), you are indicating that you are binding Licensee
** to the terms of this Agreement, and that you are duly authorized by Licensee to do so.
** If you are not authorized to bind Licensee to the terms of this Agreement,
** or if Licensee does not agree to be bound by all of the terms of this Agreement,
** do not install or use any such software.
**
**
** 1.	Grant of License.  Subject to the terms and conditions of this Agreement,
** Atmel grants Licensee a non-exclusive, non-transferable, non-sublicensable,
** limited license to use the Licensed Software solely in connection with Atmel products
** from SAM9 and SAMA5 families (“Atmel Product”).
**
** 2.	Restrictions.  Except as expressly set forth in Section 1, Licensee will not,
** and will have no right to, (a) use, copy or reproduce any Licensed Software except,
** (b) modify, create derivative works of, sell, distribute, transfer or disclose any
** Licensed Software. Without limiting the generality of the foregoing, Licensee will not,
** and will have no right to, use any Licensed Software for any semiconductor products
** that are not Atmel Products. Licensee will not remove, obscure or alter any trademark,
** copyright or other proprietary rights or ownership notices of Atmel that appear
** in any Licensed Software.
**
** 3.  	Title.  As between the parties, Atmel retains full rights, title, and ownership
** including all patents, copyrights, trade secrets, trade names, trademarks, and other
** intellectual property rights in and to the Licensed Software.
**
** 4.  	No Other Rights.  Except as expressly stated herein, this Agreement does not grant
** Licensee any rights to patents, copyrights, trade secrets, trade names, trademarks
** (whether registered or unregistered), or any other rights, franchises, or licenses
** in respect of the Licensed Software.
**
** 5.	Disclaimer of Warranty and No Support.  ALL LICENSED SOFTWARE IS PROVIDED “AS IS”,
** “WITH ALL FAULTS”, AND WITH NO WARRANTY WHATSOEVER.  ATMEL EXPRESSLY DISCLAIMS ALL
** WARRANTIES OF ANY KIND (WHEHTER EXPRESS, IMPLIED, STATUTORY OR OTHERWISE) IN CONNECTION
** WITH THE LICENSED SOFTWARE OR ANY OTHER ASPECT OF THIS AGREEMENT, INCLUDING, WITHOUT
** LIMITATION ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
** TITLE OR NON-INFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY WARRANTIES THAT MAY ARISE
** FROM COURSE OF DEALING, COURSE OF PERFORMANCE OR USAGE OF TRADE.  ATMEL WILL HAVE
** NO OBLIGATION UNDER THIS AGREEMENT TO CORRECT ANY BUGS, DEFECTS OR ERRORS IN
** THE LICENSED SOFTWARE, PROVIDE ANY UPDATES, UPGRADES OR NEW RELEASES OF THE LICENSED SOFTWARE,
** OR OTHERWISE PROVIDE ANY SUPPORT OR MAINTENANCE FOR THE LICENSED SOFTWARE.
**
** 6.  	Export.  Licensee will comply with all applicable laws and regulations of all
** relevant jurisdictions in connection with its activities related to the Licensed Software.
** Without limitation of the foregoing, Licensee acknowledges that certain laws
** and regulations of the United States and other jurisdictions may pertain to the export
** and re-export of the Licensed Software, and Licensee will not export or re-export
** any Licensed Software in any form without the appropriate governmental approvals,
** or otherwise in violation of any such laws or regulations.
**
** 7.	Termination.  The license will automatically terminate if Licensee fails to comply
** with any of the terms and conditions of the license including, without limitation
** the confidentiality obligation or the obligations set forth in Sections 1, 2, 6, 7, 10
** and 11 herein. Upon termination for any reason, Licensee will immediately destroy
** or return to Atmel all whole or partial copies of the Licensed Software.
**
** 8.	High Risk Activities. LICENSEE ACKNOWLEDGES AND AGREES THAT THE LICENSED SOFTWARE
** IS NOT DESIGNED OR APPROVED FOR, AND WILL NOT BE INCORPORATED (WITHOUT THE EXPRESS WRITTEN
** APPROVAL OF AN OFFICER OF ATMEL) INTO, ANY PRODUCTS THAT ARE USED OR DESIGNED TO BE USED
** IN CONNECTION WITH ANY ACTIVITIES WHERE THE FAILURE OF SUCH PRODUCTS COULD REASONABLY
** BE EXPECTED TO RESULT IN DEATH, BODILY INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE
** ("HIGH RISK ACTIVITIES").  IN NO EVENT WILL ATMEL HAVE ANY LIABILITY TO LICENSEE
** OR ANY THIRD PARTY ARISING OUT OF OR RELATED TO ANY USE OF LICENSED SOFTWARE IN CONNECTION
** WITH HIGH RISK ACTIVITIES, AND ATMEL HEREBY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF
** FITNESS FOR ANY HIGH RISK ACTIVITIES.
**
** 9.  	LIMITATION OF LIABILITY.  TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT WILL
** ATMEL BE LIABLE TO LICENSEE OR ANY THIRD PARTY (WHETHER SUCH LIABILITY IS BASED ON CONTRACT,
** NEGLIGENCE, STRICT LIABILITY, OTHER TORT THEORY, CONTRIBUTION, BREACH OF WARRANTY,
** OR OTHER LEGAL OR EQUITABLE THEORY) FOR ANY SPECIAL, INDIRECT, INCIDENTAL, EXEMPLARY,
** PUNITIVE OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES FOR LOSS OF PROFITS,
** LOSS OR INTERRUPTION OF BUSINESS, OR LOSS OF DATA, ARISING OUT OF OR RELATING TO
** THE LICENSED SOFTWARE OR ANY OTHER ASPECT OF THIS AGREEMENT, EVEN IF ATMEL has been advised
** of or should have known of the possibility of such damages.
**
** IN NO EVENT WILL ATMEL’S TOTAL LIABILITY ARISING OUT OF OR RELATED TO THE LICENSED SOFTWARE
** OR ANY OTHER ASPECT OF THIS AGREEMENT (WHETHER UNDER CONTRACT, NEGLIGENCE, STRICT LIABILITY,
** CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL OR EQUITABLE THEORY) EXCEED THE GREATER OF
** (A) THE AGGREGATE OF ALL LICENSE FEES PAID BY LICENSEE TO ATMEL FOR THE LICENSED SOFTWARE, OR
** (B) ONE THOUSAND DOLLARS ($1,000). WITHOUT LIMITING THE FOREGOING,
** AND Notwithstanding any provision herein to the contrary, ATMEL will not be liable for
** ANY costs of PROCURING SUBSTITUTE GOODS, SERVICES OR TECHNOLOGY under any circumstances.
**
** Each Party acknowledges that THE OTHER PARTY has entered into this agreement in reliance
** on the limitations of liability, DISCLAIMERS OF WARRANTIES, EXCLUSION OF DAMAGES
** AND EXCLUSIVE REMEDIES contained in this AGREEMENT, AND THAT EACH OF THE FOREGOING PROVISIONS FORMS
** AN ESSENTIAL AND fundamental part of the basis of the bargain BETWEEN THE PARTIES,
** WITHOUT WHICH SUCH the other Party would not have entered into this Agreement.
** EACH PARTY AGREES THAT SUCH PROVISIONS WILL SURVIVE AND APPLY NOTWITHSTANDING ANY
** FAILURE OF ESSENTIAL PURPOSE OF ANY LIMITED REMEDY OR LIMITATION OF LIABILITY.
**
** 10.  	Governing Law; Dispute Resolution. This Agreement is to be construed in accordance
** with and governed by the internal laws of the State of California (as permitted by Section 1646.5
** of the California Civil Code or any similar successor provision), without giving effect
** to any choice of law rule that would cause the application of the laws of any jurisdiction
** other than the internal laws of the State of California to the rights and duties of the parties.
** This Agreement will not be governed by the U.N. Convention on the Sale of Goods,
** the application of which is expressly excluded. Except for actions for injunctive
** or other equitable relief, which may be brought in any court of competent jurisdiction,
** all disputes arising out of or related to this Agreement will be subject to the exclusive
** jurisdiction of the California state courts in Santa Clara County, California,
** or if there is exclusive federal jurisdiction, the United States District Court for
** the Northern District of California, and the Parties hereby consent to, and agree to submit to,
** the personal and exclusive jurisdiction and venue of such courts.
**
** 11. 	General. Licensee will not, and will have no right to, assign, delegate or otherwise
** transfer (whether voluntarily, by operation of law or otherwise) this Agreement or any of
** its rights or obligations hereunder to any third party without the prior written consent
** of Atmel, and any purported assignment, delegation or other transfer without such consent
** will have no force or effect. Subject to the foregoing, this Agreement will be binding upon
** and will inure to the benefit of the parties and their respective successors and permitted assigns.
** No failure of either party to enforce any right under this Agreement will be deemed a waiver
** of such right or any other right under this Agreement. Any waiver by a party of a breach
** of any provision of this Agreement by the other party hereunder will not be deemed to be
** a waiver of any subsequent breach of such provision or a waiver of any breach of any other
** provision of this Agreement.
** This Agreement may not be superseded, modified, or amended except in a writing signed by an officer
** of each party. If any provision of this Agreement is determined to be invalid, illegal
** or otherwise unenforceable, such provision will be enforced to the extent possible consistent
** with the intent of the parties, and the remaining provisions of this Agreement will remain in
** full force and effect. This Agreement will be fairly interpreted in accordance with its terms
** and without any strict construction against either party because it was drafted by such party
** or for any other reason. This Agreement will constitute the entire agreement between the parties
** relating to the subject matter hereof, and expressly supersedes and replaces all prior
** and contemporaneous agreements, proposals, quotations, negotiations and communications, written
** or oral, between the parties relating to such subject matter.
**
**
** Software Author: Timesys Corporation (www.timesys.com)
**
** Summary: Small version of the application implements dynamic zone switching
**
****************************************************************************/


#include "zoneselector.h"
#include "imagewidget.h"
#include "customtoolbutton.h"
#include <QPainter>
#include <QPaintEvent>
#include <QLayout>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QPushButton>
#include <QPropertyAnimation>
#include <QTimer>
#include <QDebug>

extern bool isSmallResolution;

ZoneSelector:: ZoneSelector( QWidget *parent) :
    QWidget(parent),
    mBackgroundColor(Qt::black),
    mTitleImage( new ImageWidget(this)),
    mButtonLayout(0),
    mCanHide(false),
    mAnimationFinished(true)
{
    //setAttribute( Qt::WA_NoSystemBackground);

    mShowButton = new QPushButton(this);
    mShowButton->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed);
    mShowButton->setStyleSheet("background-color: rgb(21, 26, 32)");
    QIcon icon;
    icon.addFile( ":/resources/smallcamera/left.png", QSize(), QIcon::Normal, QIcon::On);
    icon.addFile( ":/resources/smallcamera/right.png", QSize(), QIcon::Normal, QIcon::Off);
    mShowButton->setAutoFillBackground( false);
    mShowButton->setFocusPolicy( Qt::NoFocus);
    mShowButton->setCheckable( true);
    mShowButton->setChecked( false);
    mShowButton->setFlat( true);
    mShowButton->setIcon( icon);
    mShowButton->hide();
    connect( mShowButton, SIGNAL(clicked(bool)), this, SLOT(setButtonsVisibility(bool)));

    mShowAnimation = new QPropertyAnimation( this, "geometry");
    connect( mShowAnimation, SIGNAL(finished()), this, SLOT(postAnimation()));
    mHideAnimation = new QPropertyAnimation( this, "geometry");
    connect( mHideAnimation, SIGNAL(finished()), this, SLOT(postAnimation()));

    mBottomLine = new QWidget(this);
    mBottomLine->setMinimumHeight(1);
    mBottomLine->setMaximumHeight(1);
    mBottomLine->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed);

    mMainLayout = new QVBoxLayout(this);
    mMainLayout->setContentsMargins(0,0,0,0);
    mMainLayout->setSpacing(0);
    mMainLayout->addWidget( mBottomLine);

    mAutoHideTimer = new QTimer(this);
    mAutoHideTimer->setSingleShot(true);
    mAutoHideTimer->setInterval(3000); //can make public api later
    connect( mAutoHideTimer, SIGNAL(timeout()), this, SLOT(hideTimeout()));
}

ZoneSelector:: ~ZoneSelector()
{
    delete mButtonLayout;
}

/*! \brief set list of zone names
 *
 * This is the only function thast will trhigger the relayout,
 * so ensure you call it as the last one before showing widget*/
void ZoneSelector:: setZoneList( const QStringList& zoneList)
{
    if (mZoneList != zoneList) {
        //workaround: for now setZoneList is called much to frequent due to complex signal connection in app
        mZoneList = zoneList;
        removeOldLayout();
        createHBoxLayout();
    }
}

void ZoneSelector:: setCanHide(bool canHide)
{
    mCanHide = canHide;
}

void ZoneSelector:: setBackgroundColor(QColor color)
{
    mBackgroundColor = color; //will take effect after next repaint
}

void ZoneSelector:: setLineColor( QColor color)
{
    mBottomLine->setStyleSheet("background-color: " + color.name());
}

void ZoneSelector:: setTitlePixmap(const QPixmap& pixmap)
{
    mTitleImage->setPixmap( pixmap);
}

void ZoneSelector:: setButtonFont( const QFont& font)
{
    mFont = font;
}

void ZoneSelector:: setWidth( int width)
{
    if (mCanHide)
        setGeometry( mShowButton->isChecked() ? 0 : mShowButton->width() - width,
                     0, width, mTitleImage->height());
}

void ZoneSelector:: paintEvent(QPaintEvent * event)
{
    QPainter painter(this);
    painter.fillRect( event->rect(), mBackgroundColor);
}

void ZoneSelector:: resizeEvent(QResizeEvent * event)
{
    Q_UNUSED(event)
    if (mAnimationFinished) {
        mShowAnimation->setEndValue( QRect(0, y(), width(), height()));
        mHideAnimation->setEndValue( QRect(/*mShowButton->width()*/ - width(), y(), width(), height()));
    }
}

void ZoneSelector:: buttonClicked()
{
    CustomToolButton *button = dynamic_cast<CustomToolButton*>( sender());
    if (button) {
        if(isSmallResolution)
            mAutoHideTimer->start();
        emit zoneSelected( button->text());
        repaint();
    }  
}

void ZoneSelector:: setButtonsVisibility( bool show)
{
    if (mAnimationFinished) {
        mAnimationFinished = false;
        if (show) {
            mShowAnimation->start();
        } else {
            mAutoHideTimer->stop();
            mHideAnimation->start();
        }
    }
}

void ZoneSelector:: postAnimation()
{
    mAnimationFinished = true;
    if (mShowButton->isChecked())
        mAutoHideTimer->start();
    emit menuShown( mShowButton->isChecked());
}

void ZoneSelector:: hideTimeout()
{
    mShowButton->setChecked( false);
    setButtonsVisibility( false);
}

void ZoneSelector:: createHBoxLayout()
{
    mButtonLayout = new QHBoxLayout( );
    mButtonLayout->setContentsMargins(0,0,0,0);
    mButtonLayout->setSpacing(0);
    if (!mTitleImage->sizeHint().isNull())
        mButtonLayout->addWidget( mTitleImage);
    mCheckFirstButton = true;
    foreach (QString zone, mZoneList) {
        if (zone == "")
            continue;
        addButtonToLayout( zone, mButtonLayout);
    }
    mButtonLayout->addSpacerItem( new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum));
    if (mCanHide) {
        mShowButton->show();
        mButtonLayout->addWidget( mShowButton);
    }
    mMainLayout->insertLayout( 0, mButtonLayout);
}


void ZoneSelector:: removeOldLayout()
{
    qDebug("clear old layout");
    if (mButtonLayout) {
        mMainLayout->removeItem( mButtonLayout);
        while (!mButtonLayout->isEmpty()) {
            QLayoutItem *item = mButtonLayout->takeAt(0);
            if (item->widget() != mTitleImage) {
                //mButtonLayout->removeWidget( widget);
                delete item->widget();
            }
            delete item;
        }
        delete mButtonLayout;
    }
}

void ZoneSelector:: addButtonToLayout(QString text, QLayout* layout)
{
    CustomToolButton *button = new CustomToolButton(this);
    button->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum);
    button->setCheckable(true);
    button->setAutoExclusive( true);
    if (mCheckFirstButton) {
        mCheckFirstButton = false;
        button->setChecked( true);
    }
    button->setText( text);
    button->setFont( mFont);
    connect( button, SIGNAL(clicked()), this, SLOT( buttonClicked()));
    layout->addWidget( button);
}
